// 对 axios 对象进行封装
import axios from "axios";

// 创建axios实例
const instance = axios.create({
  baseURL: "http://kumanxuan1.f3322.net:8881/cms",
  timeout: 5000,
});

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 1. 什么时候执行这个函数？？----- 在请求发出之前执行
    // 2. config 是什么？？ ----- 是一个对象，保存了关于本次请求的信息
    // 3. 这个函数用来干什么？？----- 可以用来做一些请求前的准备（比如：添加请求头）

    // 在发送请求之前做些什么
    // console.log("请求拦截器中的代码", config);
    // if (config.url === "/sendSMS" || config.url === "/wechatUsers/PCLogin") {
    //   config.headers["Content-Type"] = "application/x-www-form-urlencoded";
    // }

    // 判断本地有没有token，如果有就在请求头带上 token
    const token = localStorage.getItem("x-auth-token");
    if (token) {
      config.headers["x-auth-token"] = token;
    }
    // console.log(config);

    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 1. 这个函数什么时候执行？？ ----- 后端返回数据，并且在组件内部接收之前执行
    // 2. response 是axios 封装的关于本次响应的对象,response.data 就是后端返回给我们的数据
    // 3. 这个函数用来做什么？？ ----- 对服务器响应回来的数据进行统一处理

    // 对响应数据做点什么

    // 统一处理响应状态码不为0的情况，也就是错误的情况
    let res_data = response.data;
    if (res_data.code != 0 && res_data.code != 407 && res_data.code != 400) {
      // 业务失败的时候提示用户有问题
      alert(res_data.message);
      return false; // 失败直接返回 false
    }

    // console.log("响应拦截器中的代码",  response);
    return response.data; // 这里的数据，return 到组件内部请求的回调函数中的res
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    // 相当于我们在组件中，发送请求之后的catch方法
    alert(error);
    // 直接抛出这个错误
    return Promise.reject(error);
  }
);

export default instance;
